#传统方式的使用
import os

import dotenv
from langchain_classic.agents import AgentType, initialize_agent
from langchain_community.tools import TavilySearchResults
from langchain_core.tools import Tool
from langchain_openai import ChatOpenAI
from openai import BaseModel

dotenv.load_dotenv()

#自定义函数1
def search_subject_score(*args, **kwargs) -> str:
    # 处理位置参数和关键字参数
    if args:
        # 如果有位置参数，假设第一个是name，第二个是subject
        name = args[0] if len(args) > 0 else ''
        subject = args[1] if len(args) > 1 else ''
    else:
        # 否则从关键字参数中获取
        name = kwargs.get('name', '')
        subject = kwargs.get('subject', '')

    return f"{name}的{subject}成绩是80分"

search_tool = Tool(
    name="search_subject_score",
    description="根据姓名和科目，返回该学生的该科成绩",
    func=search_subject_score
)

#自定义函数2
def price_of_apples(query : str) ->str:
    return "苹果的当前价格是5元"

price_tool = Tool(
    name="price_of_apples",
    description="查看当前苹果价格",
    func=price_of_apples
)

#获取大语言模型
chat_model = ChatOpenAI(
        model=os.getenv("MODEL_NAME")
        , base_url=os.getenv("BASE_URL")
        , api_key=os.getenv("API_KEY")
        , temperature=0.8  # 精确度
        , max_tokens=1024  # 回答长度
    )

#获取Agent实例
agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION #获取一个没有样例的实例

#获取AgentExecutor实例
agent_executor = initialize_agent(
    tools=[search_tool, price_tool]
    , llm=chat_model
    , agent=agent
    , verbose=True #显示运行过程
)

#调用invoke()得到响应
response = agent_executor.invoke("现在苹果什么价格？")
print(response)